﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Logica.Clases;

namespace Sistema_Totem.Datos.SqlServer
{
    public class SqlServerProyecto
    {

            #region Agregar Proyecto

        public bool AgregarProyecto(Proyecto proyecto)
        {
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[insertarProyecto]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@codigo", proyecto.Codigos);
                command.Parameters.AddWithValue("@nombre", proyecto.Nombres);
                command.Parameters.AddWithValue("@fecha_in", proyecto.FechaInicio);
                command.Parameters.AddWithValue("@fecha_fi", proyecto.FechaFin);
                command.Parameters.AddWithValue("@descripcion", proyecto.Descripcion);
                command.Parameters.AddWithValue("@status", proyecto.Status);
                command.Parameters.AddWithValue("@area", proyecto.Area);
                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                bd.CerrarConexionBd();
                return true;
            }
            catch (SqlException e)
            {
                throw new Exception("Error en la conexion", e);
               
            }
            catch (Exception e)
            {

                throw new Exception("Error en la Base de Datos", e);
            }
            finally
            {
                bd.CerrarConexionBd(); //cerramos la conexion
            }


        }

        public bool ModificarProyectoInsertado(int idproyecto)
        {
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[modificarProyectoInsertado]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idproyecto", idproyecto);
                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                bd.CerrarConexionBd();
                return true;
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return false;
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                return false;
            }

        }


            #endregion Agregar Proyecto
        #region Cerrar Proyecto
        public void CerrarProyecto(int idproyecto)
        {
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[CerrarProyecto]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idproyecto", idproyecto);
                command.Parameters.AddWithValue("@fecha", DateTime.Now);
                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                bd.CerrarConexionBd();
                
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
               
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                
            }

        }
        #endregion Cerrar Proyecto

        #region Agregar Plantilla Proyecto

        public bool AgregarPlantillaProyecto(int idplantilla, int idproyecto)
        {
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[insertarPlantillaProyecto]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idplantilla", idplantilla);
                command.Parameters.AddWithValue("@idproyecto", idproyecto);
                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
            }
            catch (SqlException e)
            {
                throw new Exception("Error en conectar a la base de datos", e);
                
            }
            catch (Exception e)
            {
                throw new Exception("Error en la conexion", e);
                
            }
            finally
            {
                bd.AbrirConexionBd();
                
            }
            return true;
            

        }

        #endregion Agregar Plantilla Proyecto

            #region Agregar Involucrado Proyecto

        public bool AgregarInvolucradoProyecto(int idinvolucrado, int idproyecto, int cliente)
        {
            Conexion bd = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SetInvolucradoProyecto]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@proyecto", idproyecto);
                command.Parameters.AddWithValue("@idinvolucrado", idinvolucrado);
                command.Parameters.AddWithValue("@idcliente", cliente);
                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
            }
            catch (SqlException e)
            {
                throw new Exception("Error en conectar a la base de datos", e);

            }
            catch (Exception e)
            {
                throw new Exception("Error en la conexion", e);

            }
            finally
            {
                bd.AbrirConexionBd();

            }
            return true;


        }

        #endregion Agregar Plantilla Proyecto

            #region Consultar Proyecto
        public List<Proyecto> ConsultarProyectos()
            {
                //Se instancia un objeto conexion 
                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();
                SqlDataReader reader = null;
                List<Proyecto> miListaProyecto = new List<Proyecto>();

                try
                {
                    //Se abre la conexion a la base de datos
                    miConexion.AbrirConexionBd();
                    command.Connection = miConexion.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[consultarListaProyecto]";
                    command.CommandTimeout = 10;

                    //se ejecuta el metodo del store procedure que busca todos los clientes del sistema
                    reader = command.ExecuteReader();

                    //Se recorre cada row
                    while (reader.Read())
                    {
                        Proyecto miProyecto = new Proyecto();
                        //Se asigna cada atributo al objeto cliente
                        miProyecto.IdProyecto = Convert.ToInt32(reader.GetDecimal(0));
                        miProyecto.Codigos = reader.GetString(1);
                        miProyecto.Nombres = reader.GetString(2);
                        miProyecto.Descripcion = reader.GetString(3);
                        miProyecto.Status = reader.GetString(4);
                        miProyecto.Area = reader.GetString(5);
                        //se inserta el cliente en la lista de clientes
                        miListaProyecto.Add(miProyecto);
                    }
                    reader.Close();
                    //return miListaProyecto;
                }
                catch (SqlException)
                {
                    throw new Exception("Error en la conexion");
                }
                finally
                {
                    miConexion.CerrarConexionBd(); // cerramos la conexion
                }
                if (miListaProyecto.Count == 0) 
                { 
                    return null; 
                }
                else
                    return miListaProyecto;



            }
            #endregion Consultar Proyecto

            #region Consultar No Involucrados
        public List<Involucrado> ConsultarNoInvolucrados(int proyecto)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Involucrado> miListaInvolucrado = new List<Involucrado>();

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[consultarNoInvolucradoProyecto]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@proyecto", proyecto);
                //se ejecuta el metodo del store procedure que busca todos los clientes del sistema
                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    Involucrado invol = new Involucrado();
                    //Se asigna cada atributo al objeto cliente
                    invol.Id = Convert.ToInt32(reader.GetDecimal(0));
                    invol.Nombre = reader.GetString(1);
                    invol.Rol.Nombre = reader.GetString(2);
                    
                    //se inserta el cliente en la lista de clientes
                    miListaInvolucrado.Add(invol);
                }
                reader.Close();
                //return miListaProyecto;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd(); // cerramos la conexion
            }
            if (miListaInvolucrado.Count == 0)
            {
                return null;
            }
            else
                return miListaInvolucrado;



        }
        #endregion Consultar Proyecto

        #region Consultar Involucrados
        public List<Involucrado> ConsultarInvolucrados(int proyecto)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Involucrado> miListaInvolucrado = new List<Involucrado>();

            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[consultarInvolucradoProyecto]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@proyecto", proyecto);
                //se ejecuta el metodo del store procedure que busca todos los clientes del sistema
                reader = command.ExecuteReader();

                //Se recorre cada row
                while (reader.Read())
                {
                    Involucrado invol = new Involucrado();
                    //Se asigna cada atributo al objeto cliente
                    invol.Id = Convert.ToInt32(reader.GetDecimal(0));
                    invol.Nombre = reader.GetString(1);
                    invol.Rol.Nombre = reader.GetString(2);

                    //se inserta el cliente en la lista de clientes
                    miListaInvolucrado.Add(invol);
                }
                reader.Close();
                //return miListaProyecto;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd(); // cerramos la conexion
            }
            if (miListaInvolucrado.Count == 0)
            {
                return null;
            }
            else
                return miListaInvolucrado;



        }
        #endregion Consultar Involucrados

        #region Consultar Cliente
        public Cliente ConsultarCliente(int proyecto)
        {
            //Se instancia un objeto conexion 
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            SqlDataReader reader = null;
            List<Involucrado> miListaInvolucrado = new List<Involucrado>();
            Cliente invol = new Cliente();
            try
            {
                //Se abre la conexion a la base de datos
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ClienteDeProyecto]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@proyecto", proyecto);
                //se ejecuta el metodo del store procedure que busca todos los clientes del sistema
                reader = command.ExecuteReader();
                
                //Se recorre cada row
                while (reader.Read())
                {
                    
                    //Se asigna cada atributo al objeto cliente
                    invol.IdPersona = Convert.ToInt32(reader.GetDecimal(0));
                    invol.Nombre = reader.GetString(1);
                    
                }
                reader.Close();
                //return miListaProyecto;
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion");
            }
            finally
            {
                miConexion.CerrarConexionBd(); // cerramos la conexion
            }
            if (miListaInvolucrado.Count == 0)
            {
                return null;
            }
            else
                return invol;



        }
        #endregion Consultar Cliente

        #region Consultar Detalle Proyecto
        public Proyecto ConsultarDetalleProyecto(int idproyecto)
            {
                //Se instancia un objeto conexion 
                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();
                SqlDataReader reader = null;
                Proyecto miProyecto = new Proyecto();
                
                try
                {
                    //Se abre la conexion a la base de datos
                    miConexion.AbrirConexionBd();
                    command.Connection = miConexion.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[mostrarProyecto]";
                    command.CommandTimeout = 10;

                    command.Parameters.AddWithValue("@idproyecto", idproyecto);

                    //se ejecuta el metodo del store procedure que busca todos los proyectos del sistema
                    reader = command.ExecuteReader();

                    //Se recorre cada row
                    while (reader.Read())
                    {
                        
                        //Se asigna cada atributo al objeto proyecto

                        //miProyecto.IdProyecto = Convert.ToInt32(reader.GetDecimal(0));
                        miProyecto.Codigos = reader.GetString(1);
                        miProyecto.Nombres = reader.GetString(2);
                        miProyecto.FechaInicio = reader.GetDateTime(3);
                        miProyecto.FechaFin = reader.GetDateTime(4);
                        miProyecto.Descripcion = reader.GetString(5);
                        miProyecto.Status = reader.GetString(6);
                        miProyecto.Area = reader.GetString(7);

                        //se inserta el cliente en la lista de proyectos
                        
                    }

                    return miProyecto;
                }
                catch (SqlException e)
                {
                    throw new Exception("Error en la conexion",e);
                }
                catch (NullReferenceException e)
                {
                    throw new Exception("Los valores que devuelven la consulta son null",e);
                }
                catch (Exception e)
                {
                    throw new Exception("Error en la consulta", e);
                }
                //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
                finally
                {
                    miConexion.CerrarConexionBd();
                }

            }
            #endregion Consultar Proyecto

            #region Modificar Proyecto

            public int ModificarProyecto(Proyecto proyecto)
            {
                //se instancia un objeto de tipo conexion y sqlCommand
                //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
                Conexion conn = new Conexion();
                SqlCommand command = new SqlCommand();
                int idInsertado = 1;
                try
                {
                    conn.AbrirConexionBd(); //se abre una conexion a base de datos

                    // se completa la informacion de la conexion , variables, y nombre del stored procedure.
                    command.Connection = conn.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[modificarProyecto]"; // StoreProcedure modificarProyecto
                    command.CommandTimeout = 10;

                    //variables del stored procedure de sql server

                    command.Parameters.AddWithValue("@idproyecto", proyecto.IdProyecto);
                    command.Parameters.AddWithValue("@nombre_proyecto", proyecto.Nombres);
                    command.Parameters.AddWithValue("@descripcion", proyecto.Descripcion);
                    command.Parameters.AddWithValue("@status", proyecto.Status);
                    command.Parameters.AddWithValue("@area", proyecto.Area);
                    command.Parameters.AddWithValue("@fecha_fin", proyecto.FechaFin);
                    

                  

                    command.Parameters["@idproyecto"].Direction = ParameterDirection.Input;
                    command.Parameters["@idnombre_proyecto"].Direction = ParameterDirection.Input;
                    command.Parameters["@fecha_fin"].Direction = ParameterDirection.Input;
                    command.Parameters["@descripcion"].Direction = ParameterDirection.Input;
                    command.Parameters["@status"].Direction = ParameterDirection.Input;
                    command.Parameters["@area"].Direction = ParameterDirection.Input;
        
                    

                    //se ejecuta el comando
                    command.ExecuteReader();


                }
                catch (SqlException e)
                {
                    idInsertado = 0;
                    throw new Exception("Error en la conexion", e);
                    // hacemos el return del ID del cliente para verficar que efectivamente se inserto el cliente
                    
                }
                //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
                finally
                {
                    conn.CerrarConexionBd();
                }

                return idInsertado;
            }

            #endregion Modificar Proyecto

            #region ModificarListaInvolucradosProyecto
            public void ModificarListaInvolucradosProyecto(int involucrado, int IdProyecto)
            {
                Conexion conn = new Conexion();
                SqlCommand command = new SqlCommand();
                try
                {
                    conn.AbrirConexionBd(); //se abre una conexion a base de datos

                    // se completa la informacion de la conexion , variables, y nombre del stored procedure.
                    command.Connection = conn.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[modificarInvolucradoProyecto]"; // StoreProcedure modificarProyecto
                    command.CommandTimeout = 10;

                    //variables del stored procedure de sql server;




                    command.Parameters["@idproyecto"].Direction = ParameterDirection.Input;
                    command.Parameters["@idnombre_proyecto"].Direction = ParameterDirection.Input;
                    command.Parameters["@fecha_fin"].Direction = ParameterDirection.Input;
                    command.Parameters["@descripcion"].Direction = ParameterDirection.Input;
                    command.Parameters["@status"].Direction = ParameterDirection.Input;
                    command.Parameters["@area"].Direction = ParameterDirection.Input;



                    //se ejecuta el comando
                    command.ExecuteReader();


                }
                catch (SqlException e)
                {
                    throw new Exception("Error en la conexion", e);
                    // hacemos el return del ID del cliente para verficar que efectivamente se inserto el cliente

                }
                //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
                finally
                {
                    conn.CerrarConexionBd();
                }

            }
            #endregion ModificarListaInvolucrados

            #region Consultar Plantilla Proyecto
            public String ConsultarPlantillaProyecto(int tipoPlantilla, int proyecto)
            {
                //Se instancia un objeto conexion 
                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();
                SqlDataReader reader = null;
                String plantilla = null;

                try
                {
                    //Se abre la conexion a la base de datos
                    miConexion.AbrirConexionBd();
                    command.Connection = miConexion.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[PlantillaDeProyecto]";
                    command.CommandTimeout = 10;

                    command.Parameters.AddWithValue("@proyecto", proyecto);
                    command.Parameters.AddWithValue("@idTipoPlantilla", tipoPlantilla);
                    //se ejecuta el metodo del store procedure que busca todos los clientes del sistema
                    reader = command.ExecuteReader();

                    //Se recorre cada row
                    while (reader.Read())
                    {
                        //Se asigna cada atributo al objeto cliente
                        plantilla = reader.GetString(0);
                    }
                    reader.Close();
                    //return miListaProyecto;
                }
                catch (SqlException)
                {
                    throw new Exception("Error en la conexion");
                }
                finally
                {
                    miConexion.CerrarConexionBd(); // cerramos la conexion
                }
                if (plantilla == null)
                {
                    return null;
                }
                else
                    return plantilla;



            }
            #endregion Consultar Plantilla Proyecto

            #region Cambiar clave LOGIN

            public bool CambiarClave(string usuario, string clave)
            {
                Conexion bd = new Conexion();
                SqlCommand command = new SqlCommand();
                try
                {
                    bd.AbrirConexionBd();
                    command.Connection = bd.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.CommandText = "[dbo].[SetCambiarContrasena]";
                    command.CommandTimeout = 10;

                    command.Parameters.AddWithValue("@idusuario", usuario);
                    command.Parameters.AddWithValue("@clave", clave);
                    
                    SqlDataReader readers = command.ExecuteReader();

                    readers.Close();
                }
                catch (SqlException e)
                {
                    throw new Exception("Error en conectar a la base de datos", e);

                }
                catch (Exception e)
                {
                    throw new Exception("Error en la conexion", e);

                }
                finally
                {
                    bd.AbrirConexionBd();

                }
                return true;


            }

            #endregion Cambiar Clave LOGIN
            #region Consultar Involucrado

            public List<Involucrado> ConsultarInvolucrados()
            {
                List<Involucrado> listaInvolucrado = new List<Involucrado>();

                Conexion miConexion = new Conexion();
                SqlCommand command = new SqlCommand();
                try
                {
                    miConexion.AbrirConexionBd();
                    command.Connection = miConexion.ObjetoConexion();
                    command.CommandType = System.Data.CommandType.Text;
                    command.CommandText = "[dbo].[NOInvolucrado]"; //Nombre del StoreProcedure "consultarTodosInvolucrado"
                    command.CommandTimeout = 10;

                    SqlDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        Involucrado involucrado = new Involucrado();

                        involucrado.Id = Convert.ToInt32(reader[0]);
                        involucrado.Nombre = reader[1].ToString();
                        involucrado.Correo = reader[2].ToString();
                        involucrado.Telefono = reader[3].ToString();
                        involucrado.Rol.Nombre = reader[4].ToString();

                        listaInvolucrado.Add(involucrado);
                    }
                    reader.Close();
                }
                catch (SqlException error)
                {
                    throw (new Exception("Error en la conexion: " + error));
                }
                catch (NullReferenceException error)
                {
                    throw (new Exception("Los valores que devuelven la consulta son null", error));
                }
                //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
                finally
                {
                    miConexion.CerrarConexionBd();
                }

                // Validamos que efectivamente la consulta devuelve aunque sea el nombre distinto a "NULL"
                if (listaInvolucrado.ElementAt(0).Nombre == null)
                {
                    return null;
                }
                else // Sino retornamos la lista del tipo Involucrados
                    return listaInvolucrado;
            }
            #endregion Consultar Involucrado


        }
    }
